package com.skivingcloud.report.service;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.skivingcloud.report.config.DataSourceConfig;
import com.skivingcloud.report.config.InfluxDbDataSourceConfig;
import com.skivingcloud.report.utils.InfluxDBConnection;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

public interface JdbcService {

    /**
     * influxdb链接测试
     * @param username 用户名
     * @param password 密码
     * @param openurl url
     * @param database 数据库名
     * @param retentionPolicy retentionPolicy
     * @return 是否
     */
    Boolean influxdbTest(String username, String password, String openurl, String database,
                      String retentionPolicy);

    /**
     * 测试elasticsearch
     * @param jdbcUrl url
     * @param userName 用户名
     * @param password 密码
     * @return 测试结果
     */
    Boolean esTest(String jdbcUrl, String userName, String password);

    /**
     * 测试关系型数据库连接
     * @param dataSourceConfig 数据库配置
     * @return 结果
     */
    Boolean testRelationalDb(DataSourceConfig dataSourceConfig);

    /**
     * 删除数据库连接池
     *
     * @param id 连接池ID
     */
    void removeJdbcConnectionPool(String id);


    /**
     * 获取连接
     *
     * @param dataSourceConfig 数据源
     */
    Connection getPooledConnection(DataSourceConfig dataSourceConfig) throws SQLException;

    /**
     * 获取influxdb的数据库连接
     * @param dataSourceConfig 配置
     * @return InfluxDBConnection
     */
    InfluxDBConnection getInfluxdbDatasource(final InfluxDbDataSourceConfig dataSourceConfig);

    /**
     * 处理sql中的动态参数，去掉空格
     * @param sqlText sql
     */
    String processSqlDynamicParam(String sqlText);

    /**
     * Influxdb列
     * @param dbConnection 数据库连接
     * @param sqlText 查询语句
     * @param dataSourceType 数据源类型
     * @param sqlParams 参数
     */
    List<Map<String, Object>> parseInfluxdbColumns(InfluxDBConnection dbConnection,
                                                   String sqlText,
                                                   String dataSourceType, String sqlParams)
            throws SQLException, JsonProcessingException;

    /**
     * 数据库列
     * @param config 配置
     * @param tplSql sql
     * @param type 类型
     * @param tplParam 参数
     * @return 列
     */
    List<Map<String, Object>> parseMetaDataColumns(DataSourceConfig config, String tplSql, String type, String tplParam) throws JsonProcessingException;


    /**
     * 存储过程关系数据库查询列
     * @param config 配置
     * @param sqlText sql
     * @param type 类型
     * @param inParams 参数
     * @param outParams 参数
     * @return 列
     */
    List<Map<String, Object>> parseProcedureColumns(DataSourceConfig config, String sqlText, String type, List<Map<String, Object>> inParams, List<Map<String, Object>> outParams);

    /**
     * 处理sql中的参数
     * @param tplSql sql
     * @param params 参数
     * @return 处理后的sql
     */
    String processSqlParams(String tplSql, Map<String, Object> params);

    /**
     * 查询获取Influxdb数据
     * @param connection 连接
     * @param sql sql
     * @return 结果集
     */
    List<Map<String, Object>> getInfluxdbData(InfluxDBConnection connection, String sql);

    /**
     * 查询获取数据库数据
     * @param config 配置
     * @param sql sql
     * @return 结果集
     */
    List<Map<String, Object>> getDatasourceDataBySql(DataSourceConfig config, String sql) throws SQLException;
}
